package com.zelin.user.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zelin.dao.BrandDao;
import com.zelin.dao.UserDao;
import com.zelin.entity.BrandEntity;
import com.zelin.entity.UserEntity;
import com.zelin.user.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * ------------------------------
 * 功能：
 * 作者：WF
 * 微信：hbxfwf13590332912
 * 创建时间：2021/8/10-16:29
 * ------------------------------
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;
    //1. 生成验证码并发送消息
    @Override
    public void getCode(String phone) {

        //1.1 生成六位数的验证码
        String code =  (long) (Math.random()*1000000)+"";
        System.out.println("验证码："+code);

        //1.2 将验证码存放到redis中
        redisTemplate.opsForValue().set(phone,code,200, TimeUnit.MINUTES);

        //1.3 将验证码信息发送给springboot-sms-service这个工程（它将监听我们发的信息）
        //1.3.1 重新组织数据（阿里云后台需要两个参数：手机号，验证号）
        Map<String,String> params = new HashMap<>();
        params.put("phone",phone);
        params.put("code",code);
        //1.3.2 将手机号及验证码发送出去
        jmsMessagingTemplate.convertAndSend("sms", params);
    }

    /**
     * 功能: 比较验证码是否相等
     * 参数:
     * 返回值: boolean
     * 时间: 2021/8/11 14:32
     */
    @Override
    public boolean purdgeCode(String validCode, String phone) {
        //1. 根据手机号得到原来的验证码
        String code = redisTemplate.opsForValue().get(phone);
        //2. 判断是否存在
        if(StringUtils.isNotBlank(validCode) && StringUtils.isNotBlank(code) && validCode.equals(code)){
            return true;
        }
        return false;
    }

    /**
     * 功能: 注册新用户
     * 参数:
     * 返回值: void
     * 时间: 2021/8/11 14:33
     */
    @Override
    public void add(UserEntity userEntity) {
        userEntity.setCreated(new Date());
        userEntity.setStatus("y");
        //1. 将原来的密码进行加密

        String pwd = passwordEncoder.encode(userEntity.getPassword());
        //2. 重新保存到数据库中
        userEntity.setPassword(pwd);
        this.save(userEntity);
    }
}
